/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../macro/head.h"
#include "rsa_impl.h"
#include "rsa_mgr.h"
#include "mgr.h"

namespace xos_encrypt
{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static rsa_mgr::ITEM_DATA xos_item_data;

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    rsa_mgr::rsa_mgr()
    {
        init_data();
    }

    rsa_mgr::~rsa_mgr()
    {
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // public method

    int rsa_mgr::get_xos_item_data( ITEM_DATA*& item_ptr )
    {
        int ret = 0;
        xos_item_data.set_container( mgr::container() );
        item_ptr = &xos_item_data;
        return ret;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int rsa_mgr::init()
    {
        int ret = 0;
        return ret;
    }

    int rsa_mgr::term()
    {
        int ret = 0;

        term_rsa();
        init_data();

        return ret;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int rsa_mgr::init_data()
    {
        int ret = 0;

        m_private_key_file = "";
        m_public_key_file = "";

        m_pPrivateRSA = 0;
        m_pPublicRSA = 0;

        m_nRsaLen = 0;

        return ret;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    // rsa方法
    int rsa_mgr::set_rsa_private_key( const char* lpszFile )
    {
        int ret = 0;
        m_private_key_file = lpszFile;
        return ret;
    }

    int rsa_mgr::set_rsa_public_key( const char* lpszFile )
    {
        int ret = 0;
        m_public_key_file = lpszFile;
        return ret;
    }

    /*
        1024 ->密文长度 128-11 ，明文128
        2048 ->密文长度 256 ，明文256
        4096 ->密文长度 512 ，明文512
    */
    int rsa_mgr::init_rsa()
    {
        int ret = 0;

        if( (0 == ret) && !m_private_key_file.empty() )
        {
            RSA* pRSA = 0;
            BIO* pBIO = 0;
            pBIO = BIO_new_file( m_private_key_file.c_str(), "rb" );
            if( pBIO )
            {
                pRSA = PEM_read_bio_RSAPrivateKey( pBIO, NULL, NULL, NULL );
                if( !pRSA )
                {
                    ret = 1;
                }
            }
            else
            {
                ret = 1;
            }
            if( 0 == ret )
            {
                m_nRsaLen = RSA_size( pRSA );
                m_pPrivateRSA = pRSA;
            }
            if( pBIO )
            {
                BIO_free( pBIO );
                pBIO = 0;
            }
        }

        if( (0 == ret) && !m_public_key_file.empty() )
        {
            RSA* pRSA = 0;
            BIO* pBIO = 0;
            pBIO = BIO_new_file( m_public_key_file.c_str(), "rb" );
            if( pBIO )
            {
                pRSA = PEM_read_bio_RSA_PUBKEY( pBIO, NULL, NULL, NULL );
                if( !pRSA )
                {
                    ret = 1;
                }
            }
            else
            {
                ret = 1;
            }
            if( 0 == ret )
            {
                m_nRsaLen = RSA_size( pRSA );
                m_pPublicRSA = pRSA;
            }
            if( pBIO )
            {
                BIO_free( pBIO );
                pBIO = 0;
            }
        }

        return ret;
    }

    i_rsa * rsa_mgr::rsa()
    {
        rsa_impl::T * pT = 0;
        xos_stl::init_pool_item( pT );
        pT->set_mgr( this );
        return pT;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int rsa_mgr::term_rsa()
    {
        int ret = 0;

        if( m_pPrivateRSA )
        {
            RSA_free( (RSA*)m_pPrivateRSA );
            m_pPrivateRSA = 0;
        }

        if( m_pPublicRSA )
        {
            RSA_free( (RSA*)m_pPublicRSA );
            m_pPublicRSA = 0;
        }

        return ret;
    }


} // xos_encrypt
